package com.czk.registerBean;

import org.springframework.beans.factory.FactoryBean;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * FactoryBean 在 spring 起到着二当家的地位，它将近有70多个小弟(实现它的接口定义)，那么它有三个方法；
 * T getObject() throws Exception; 返回bean实例对象
 * Class<?> getObjectType(); 返回实例类类型
 * boolean isSingleton(); 判断是否单例，单例会放到Spring容器中单实例缓存池中
 * 在这里我们把上面使用Java代理的对象放到了 getObject() 方法中，那么现在再从 Spring 中获取到的对象，就是我们的代理对象了。
 *
 * @Author:ChenZhangKun
 * @Date: 2021/4/2 11:34
 */
public class ProxyBeanFactory implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        // 生成代理对象
        // 拿到上下文类加载器
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        // 定义字节码数组
        Class[] classes = {IUserDao.class};
        // 定义动态代理接口
        InvocationHandler invocationHandler = (proxy, method, args) -> "你被代理了" + method.getName();
        // 返回代理对象
        return Proxy.newProxyInstance(classLoader, classes, invocationHandler);
    }

    /**
     * 实例类型数据
     *
     * @return
     */
    @Override
    public Class<?> getObjectType() {
        return IUserDao.class;
    }

    /**
     * 是否是单例
     *
     * @return
     */
    @Override
    public boolean isSingleton() {
        return true;
    }
}
